package com.geek.log4jcontrol.core;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.io.StringReader;
import java.util.Properties;

import org.apache.log4j.PropertyConfigurator;

import com.geek.log4jcontrol.commons.ConfigConstants;
import com.geek.log4jcontrol.commons.FinalConstants;
import com.geek.util.FileContextUtil;

/**
 * @package com.geek.log4jcontrol.core
 * @description log4j的配置调整
 * @author Goliath
 * @createTime 2012-8-2 下午02:38:02
 * @modifyTime
 */
public class Log4jConfigControler {

	private Log4jConfigControler() {
	}

	private static Log4jConfigControler oLog4jConfigControler = new Log4jConfigControler();
	private ConfigHisControler configHisControler = ConfigHisControler.getInstance();

	public static Log4jConfigControler getInstance() {
		return oLog4jConfigControler;
	}

	/**
	 * @description 当前的日志配置
	 */
	private String currentConfig;

	/**
	 * @package com.geek.log4jcontrol.core
	 * @description 通过Properties对象直接加载log4j配置
	 * @param properties log4j的配置
	 * @return 操作是否成功 0成功 1 失败  其余为错误编码
	 * @returnType int
	 * @author Goliath
	 * @createTime 2012-8-3 上午10:39:56
	 * @modifyTime
	 */
	public int initConfig(Properties properties) {
		PropertyConfigurator.configure(properties);
		return FinalConstants.SUCCESS;
	}

	/**
	 * @package com.geek.log4jcontrol.core
	 * @description 加载固定文件位置的log4j配置
	 * @param filePath 文件路径
	 * @return 操作是否成功 0成功 1 失败  其余为错误编码
	 * @returnType int
	 * @author Goliath
	 * @createTime 2012-8-3 上午10:39:58
	 * @modifyTime
	 */
	public int initConfigByPath(String filePath) {
		Properties props = new Properties();
		try {
			FileInputStream istream = new FileInputStream(filePath);
			props.load(istream);
			istream.close();
		} catch (IOException e) {
			return FinalConstants.FAIL;
		}
		configHisControler.makeConfigHisByPath(filePath);
		return initConfig(props);
	}

	/**
	 * @package com.geek.log4jcontrol.core
	 * @description 通过文件加载log4j配置
	 * @param configFile 配置文件
	 * @return 操作是否成功 0成功 1 失败  其余为错误编码
	 * @returnType int
	 * @author Goliath
	 * @createTime 2012-8-3 上午10:39:58
	 * @modifyTime
	 */
	public int initConfigByFile(File configFile) {
		Properties props = new Properties();
		try {
			FileInputStream istream = new FileInputStream(configFile);
			props.load(istream);
			istream.close();
		} catch (IOException e) {
			return FinalConstants.FAIL;
		}
		configHisControler.makeConfigHis(configFile);
		return initConfig(props);
	}

	/**
	 * @package com.geek.log4jcontrol.core
	 * @description 通过String对象直接加载log4j配置
	 * @param configStr log4j的配置
	 * @return 操作是否成功 0成功 1 失败  其余为错误编码
	 * @returnType int
	 * @author Goliath
	 * @createTime 2012-8-3 上午10:40:01
	 * @modifyTime
	 */
	public int initConfig(String configStr) {
		Properties props = new Properties();
		try {
			Reader reader = new StringReader(configStr);
			props.load(reader);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return initConfig(props);
	}

	/**
	 * @package com.geek.log4jcontrol.core
	 * @description 重置配置到某版本 
	 * @param configCode 配置编码
	 * @return 操作是否成功 0成功 1 失败  其余为错误编码
	 * @returnType int
	 * @author Goliath
	 * @createTime 2012-8-3 上午10:40:03
	 * @modifyTime
	 */
	public int resetConfig(String configCode) {
		return FinalConstants.SUCCESS;
	}

	public String readCurrentConfig() {
		InputStream istream = this.getClass().getResourceAsStream("/" + ConfigConstants.LOG4J_CONFIG_PATH);
		return FileContextUtil.loadContextString(istream);
	}

	public String getCurrentConfig() {
		return currentConfig;
	}

	public void setCurrentConfig(String currentConfig) {
		this.currentConfig = currentConfig;
	}
}
